package com.gph.saviorframework.wf.service;

import com.gph.saviorframework.wf.model.ActivitiDefConfig;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;

import java.util.List;
import java.util.Map;

/**
 * 工作流实例接口
 * @author guopeihui
 */
public interface ActivitiInsService {

    /**
     * 启动流程实例
     * @param processDefinitionKey 流程定义key
     * @param businessKey 业务key
     * @param userId 启动人员编号
     * @return
     */
    String startProcessInstance(String processDefinitionKey, String businessKey, String userId);

    /**
     * 启动流程实例，同时传入流程变量
     * @param processDefinitionKey
     * @param businessKey
     * @param userId
     * @param variables
     * @return
     */
    String startProcessInstanceWithVariables(String processDefinitionKey, String businessKey,
                                                      String userId, Map<String, Object> variables);

    /**
     * 启动流程实例，同时传入配置参数，在实际实现中将配置参数转化为json字符串
     * @param processDefinitionKey
     * @param businessKey
     * @param userId
     * @param configs
     * @return
     */
    String startProcessInstanceWithConfigs(String processDefinitionKey, String businessKey,
                                                      String userId, List<ActivitiDefConfig> configs);

    /**
     * 获取活动的流程实例
     * @param processDefinitionKey
     * @param userId
     * @param start
     * @param limit
     * @param sort
     * @param dir
     * @return
     */
    List<HistoricProcessInstance> findActiveProcessInstance(String processDefinitionKey, String userId, Integer start, Integer limit, String sort, String dir);

    /**
     * 获取活动的流程实例数量
     * @param processDefinitionKey
     * @param userId
     * @return
     */
    long countActiveProcessInstance(String processDefinitionKey, String userId);

    /**
     * 获取已经完成的流程实例
     * @param processDefinitionKey
     * @param userId
     * @param start
     * @param limit
     * @param sort
     * @param dir
     * @return
     */
    List<HistoricProcessInstance> findFinishedProcessInstance(String processDefinitionKey, String userId, Integer start, Integer limit, String sort, String dir);

    /**
     * 根据流程实例编号获取流程实例
     * @param processInstanceId
     * @return
     */
    HistoricProcessInstance findFinishedProcessInstance(String processInstanceId);

    /**
     * 根据流程实例编号获取流程实例
     * @param processInstanceId
     * @return
     */
    HistoricProcessInstance findProcessInstance(String processInstanceId);

    /**
     * 获取未完成的流程实例
     * @param processInstanceId
     * @return
     */
    HistoricProcessInstance findUnFinishedProcessInstance(String processInstanceId);

    /**
     * 获取历史流程实例
     * @param processInstanceId
     * @return
     */
    HistoricProcessInstance findHistoryProcessInstance(String processInstanceId);

    /**
     * 获取完成的流程实例数
     * @param processDefinitionKey
     * @param userId
     * @return
     */
    long countFinishedProcessInstance(String processDefinitionKey, String userId);


    /**
     * 预览流程实例图，返回byte[]，客户端自行转化为InputStream，原因是kryo序列化方式不支持InputStream
     * @param processInstanceId
     * @return
     */
    byte[] viewProcessInstanceDiagram(String processInstanceId);

    /**
     * 通过png图片的方式预览流程进展
     * @param processInstanceId
     * @return
     */
    byte[] viewProcessInstanceDiagram(String processInstanceId,String resourceType);

    /**
     * 流程跟踪
     * @param processInstanceId
     * @return
     * @throws Exception
     */
    List<Map<String, Object>> traceProcess(String processInstanceId) throws Exception;

    /**
     * 获取所有完成的流程实例
     * @param start
     * @param limit
     * @param sort
     * @param dir
     * @return
     */
    List<HistoricProcessInstance> findAllFinishedProcessInstance(Integer start, Integer limit, String sort, String dir);

    /**
     * 计算所有完成的流程实例数量
     * @return
     */
    long countAllFinishedProcessInstance();

    /**
     * 获取正在运行的流程实例
     * @param start
     * @param limit
     * @param sort
     * @param dir
     * @return
     */
    List<HistoricProcessInstance> findRuntimeProcessInstance(Integer start, Integer limit, String sort, String dir);

    /**
     * 获取正在运行的流程实例
     * @param start
     * @param limit
     * @param sort
     * @param dir
     * @param defKey 流程定义key
     * @return
     */
    List<HistoricProcessInstance> findRuntimeProcessInstance(String defKey,Integer start, Integer limit, String sort, String dir);

    /**
     * 计算正在运行的流程实例数量
     * @return
     */
    long countRuntimeProcessInstance();

    /**
     * 删除流程实例
     * @param processInstanceId
     */
    void deleteHistoryProcessInstance(String processInstanceId);

    /**
     * 删除运行中的流程实例
     * @param processInstanceId
     */
    void deleteRuningProcessInstance(String processInstanceId);

    /**
     * 删除运行中的流程实例
     * @param processInstanceId 流程实例编号
     * @param deleteReason 删除原因
     */
    void deleteRuningProcessInstance(String processInstanceId,String deleteReason);
    
    /**
     * 正常完成运行中的流程实例，逻辑是跳转到结束节点，触发完成事件
     * @param processInstanceId
     */
    void completeRuningProcessInstance(String processInstanceId);


    /**
     * 获取所有的流程实例
     * @param start
     * @param limit
     * @param sort
     * @param dir
     * @return
     */
    Map<String,Object> findAllProcessInstanceMap(Integer start, Integer limit, String sort, String dir);
}
